查看原文
其他

6大模块拿下Python时间序列

尤而小屋 尤而小屋 2022-06-19

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

在我们的生活中,时间总是无处不在的:

  • 我每天早上9点坐地铁去上班
  • 上周一的上午10点半,我开了个会
  • 2008年8月8日北京奥运会开幕
  • 小明同学出生在1998年1月4日10点09分
  • 北京时间是以东八区为准的
  • 我想给这个自己的爬虫价格定时任务……

我们似乎生活在一个被年、月、日、时、分、秒、毫秒等时间包围的世界中,但你真的了解时间吗?Python又有哪些处理时间的相关库呢?时间序列又有什么妙用?

接下来Peter会开启Pandas一系列以时间序列为主题的进阶文章,随时更新,欢迎阅读~

科普内容

目前世界上公认的秒:指的是在现行国际单位制下,在1967年召开的第13届国际度量衡大会对秒的定义是:铯133原子基态的两个超精细能级间跃迁对应辐射的9,192,631,770个周期的持续时间。

起始历元定在1958年1月1日0时。

下面是记录的是秒的各级单位(来自维基百科),感觉自己也长见识了:

闰秒

除了我们常听到的闰年,还有闰秒的概念。

闰秒是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。

由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使世界时(民用时)和原子时之间相差超过到±0.9秒时,就把世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒)。

闰秒一般加在公历年末或公历六月末。

GMT

格林尼治平均时间(英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台当地的平太阳时,因为本初子午线被定义为通过那里的经线。

自1924年2月5日开始,格林尼治天文台负责每隔一小时向全世界发放调时信息。

格林尼治标准时间的正午是指当平太阳横穿格林尼治子午线时(也就是在格林尼治上空最高点时)的时间。

由于地球每天的自转是有些不规则的,而且正在缓慢减速,因此格林尼治平时基于天文观测本身的缺陷,已经被原子钟报时的协调世界时(UTC)所取代。

UTC

协调世界时间(Coordinated Universal Time)简称为UTC,也称为世界标准时间,基于国际原子钟,误差为每日数纳秒。

协调世界时的秒长与原子时的秒长一致,在时刻上则要求尽量与世界时接近(规定二者的差值保持在 0.9秒以内)。

Unix时间戳

时间戳指的是从协调世界时间(UTC)1970年1月1日0时0分0秒开始到现在的总秒数,一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。

时区

时区是地球上的区域使用同一个时间定义。

有关国际会议决定将地球表面按经线从南到北,划分成24个时区,并且规定相邻区域的时间相差1小时。

当人们跨过一个区域,就将自己的时钟校正1小时(规定:向西减1小时,向东加1小时),跨过几个区域就加或减几小时。比如我们伟大的中国处于东八区,表示为GMT+8。

Python时间模块

Python有很多的时间模块能够处理我们遇到的各种时间问题,后续会分别介绍各种库的使用,它们分别是:

  • time
  • datetime
  • calendar
  • pytz
  • dateutil
  • arrow

time 模块

简介

首先介绍的是Python中常用 time 模块。在Python文档中,time是属于GOSS(Generic Operating System Services),提供的是更加接近操作系统层面的服务。

同时,time模块主要还是围绕unix timestamp时间戳来进行的。

⚠️注意点:由于该模块是基于Unix Timestamp,所以其能表述的日期范围只能在 1970-2038 之间;如果说我们涉及到的日期不在这个范围内,必须使用datetime模块(后面介绍)。

使用

使用之前我们先导入模块,否则报错

import time

1、time:查看当前时间的时间戳

time.time()

1633396517.702991

2、localtime:查看当前时间的时间(以元组的形式)

如果我们不加参数,默认是当前时间的时间戳作为参数

传入的参数是时间戳。默认是当前时间的时间戳

time.localtime()

time.struct_time(tm_year=2021,  # 元组形式:年月日时分秒
                 tm_mon=10, 
                 tm_mday=5, 
                 tm_hour=9, 
                 tm_min=15, 
                 tm_sec=17, 
                 tm_wday=1, 
                 tm_yday=278, 
                 tm_isdst=0)

下表格是每个参数的含义解释:

序号属性
0tm_year年,比如2020
1tm_mon月,1 到 12
2tm_mday日,1 到 31
3tm_hour时,0 到 23
4tm_min分,0 到 59
5tm_sec秒,0 到 61 (60或61 是闰秒)
6tm_wday一周中的第几天,0到6 (0是周一)
7tm_yday一年中的第几天,1 到 366
8tm_isdst-1, 0, 1, -1是决定是否为夏令时的旗帜

此外,我们还可以指定某个具体的时间戳作为参数:

time.localtime(1600000000)   # 指定时间戳

time.struct_time(tm_year=2020, 
                 tm_mon=9, 
                 tm_mday=13, 
                 tm_hour=20, 
                 tm_min=26, 
                 tm_sec=40, 
                 tm_wday=6, 
                 tm_yday=257, 
                 tm_isdst=0)

3、gmtime:返回当前时间的struct_time形式,UTC时区(0时区) ,可传入时间戳格式时间

传入的参数必须是时间戳。默认是当前时间的时间戳

time.gmtime()  # 默认当前时间戳

time.struct_time(tm_year=2021, tm_mon=10, tm_mday=5, tm_hour=1, tm_min=33, tm_sec=25, tm_wday=1, tm_yday=278, tm_isdst=0)

time.gmtime(time.time())   # time.time()也是获取当前时间戳

time.struct_time(tm_year=2021, tm_mon=10, tm_mday=5, tm_hour=1, tm_min=33, tm_sec=25, tm_wday=1, tm_yday=278, tm_isdst=0)

time.gmtime(1617880000)  # 指定一个时间戳

time.struct_time(tm_year=2021, tm_mon=4, tm_mday=8, tm_hour=11, tm_min=6, tm_sec=40, tm_wday=3, tm_yday=98, tm_isdst=0)

4、asctime:返回字符串形式的时间,可以传入struct_time形式时间,用来做转化

传入的参数是时间元组形式;结果是字符串形式

(1)默认情况使用:

(2)通过time.localtime()得到一个时间元组形式:

(3)传入当地时间的时间戳形式:

(4)通过time.time()得到时间戳,再将结果传给time.localtime(),得到时间元组,最后将元组再传给time.asctime():

5、ctime:返回字符串形式的时间,可以传入时间戳格式时间,用来做转化

传入的参数是时间戳,结果是字符串形式

(1)默认情况

(2)指定某个时间戳

(3)传入中间结果的时间戳

time.time()得到的是当前时间的时间戳

6、mktime:时间元组转成时间戳形式,必须带上时间元组作为参数

传入参数是时间元组形式,返回的结果是时间戳

(1)通过time.localtime()得到时间元组,传给time.mktime

(2)传入其他事件元组的结果作为参数

7、strftime:把一个时间元组格式化为时间字符串。如果未指定,默认将传入time.localtime()。如果元组中任何一个元素越界,将会报错。

传入参数是元组格式的时间,返回结果是时间字符串

(1)默认输出的都是当前时间

(2)指定某个时间元组

在指定格式的同时,我们还可以传入一个时间元组:

下表格是常用的时间格式和含义:

格式含义取值范围(样式)
%y去掉世纪的年份00-99,如“19”
%Y完整的年份如2019
%j指定日期是一年中的第几天范围001-366
%m返回的是月份范围:01-12
%b本地简化月份的名称简写的英文月份
%B本地完整月份的名称完整的英文月份
%d该月的第几日如,5月1日返回的是“01”
%H第几小时,24小时制00-23
%l第几小时,12小时制00-12
%M分钟00-59
%S00-59
%U该年中的第几个星期(周日为一周的起点)00-53
%W同上,周一为起点00-53
%w一个星期中的第几天0-6
%Z时区在大陆测试返回的是CST
%x日期日/月/年
%X时间时:分:秒
%c详细日期时间日/月/年时:分:秒
%%%字符'%'字符
%p上下午AM or PM

8、strptime:将字符串形式的时间转成时间元组;和strftime相反功能

两个参数:第一个是字符串形式的时间数据,第二个是我们指定的格式

8大方法总结

time模块的8大方法的输入和输出总结:

方法输入输出
time时间戳
localtime时间戳时间元组
gmtime时间戳时间元组
asctime时间元组字符串
ctime时间戳字符串
mktime时间元组时间戳
strftime格式、时间元组(可选)字符串
strptime字符串、格式时间元组

时间网站

时间与日期

1、公历转农历:https://pypi.python.org/pypi/LunarSolarConverter/

2、Moment:https://github.com/zachwill/moment

3、When:https://whenpy.readthedocs.io/en/latest/

4、Pendulum:https://pendulum.eustace.io/

5、时间机器:https://github.com/spulec/freezegun

6、工作日历:https://github.com/peopledoc/workalendar

7、中国法定节假日:https://github.com/NateScarlet/holiday-cn

8、Python3-cookbook:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html

时间戳相关

在很多的时候我们遇到的时间都是通过时间戳的形式表示的,如何将时间戳转成我们常见的时间形式呢?介绍几个常用的网站:

1、站长工具:https://tool.chinaz.com/tools/unixtime.aspx

2、sojson:https://www.sojson.com/unixtime.html

3、Toolfun:https://tools.fun/timestamp.html

4、北京时间:https://www.beijing-time.org/shijianchuo/

5、在线工具:https://tool.lu/timestamp/

最后一张6个模块的完整思维导图送给你们,后续会更新剩下5个库的使用:

  • 欢迎关注公众号:尤而小屋
  • 回复 time 即可领取高清思维导图


推荐阅读


Python入门:3000字深入剖析变量和赋值

对比SQL,学习Pandas操作:groupby机制

《Tableau中文入门手册》:免费领取

简洁且实用Python一行代码,40个案例讲解

惊叹!年薪70万的阿里数据岗位面试题曝光!

尤而小屋,一个温馨的小屋。小屋主人,一手代码谋求生存,一手掌勺享受生活,欢迎你的光临

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存